/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.us.aws.playAnalyzator;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author jenkin90
 */
public class GooglePlayExtractor {

    private List<Aplicacion> aplicaciones;
    private URL gp;
    private BufferedReader br = null;
    private InputStream is;
    private String codigoPagina;
    private Analizador analizador = new AnalizadorImpl();

    private String getPagina(String url) {
        String lineaLeida;
        String pagina = "";
        try {
            this.gp = new URL(url);
            this.is = gp.openStream();  // throws an IOException
            br = new BufferedReader(new InputStreamReader(is));

            while ((lineaLeida = br.readLine()) != null) {
                pagina += lineaLeida;
            }
        } catch (MalformedURLException ex) {
            Logger.getLogger(GooglePlayExtractor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(GooglePlayExtractor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(GooglePlayExtractor.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return pagina;
        }


    }

    public GooglePlayExtractor() {
        this.aplicaciones = new ArrayList<Aplicacion>();
    }

    public void getAplicacionesCategorias(String Categoria, boolean gratuito) {

        String url = "https://play.google.com/store/apps/category/" + Categoria;

        if (gratuito) {
            url = url + "/collection/topselling_free?start=";
        } else {
            url = url + "/collection/topselling_paid?start=";
        }

        int i = 1;
        boolean mAplicaciones = true;
        while ((i < 500) && (mAplicaciones)) //  for (int i=24; i<500; i=i+24)
        {
            Integer indice = i;
            url = url + indice.toString();
            mAplicaciones = getAplicaciones(url);
            int fin = url.indexOf("=");
            url = url.substring(0, fin + 1);
            i = i + 24;
            System.out.println(i);
            System.out.println(mAplicaciones);
        }
        this.getDatosAplicacion();
    }

    public void getDescripcion(Aplicacion a) {
        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();
        String subpag = pagina.substring(pagina.indexOf("<div id=\"doc-original-text\" itemprop=\"description\">") + 51, pagina.length() - 1);
        String descrip = subpag.substring(0, subpag.indexOf("</div>"));

        String descripc[] = descrip.split("<p>");
        String descripcion = "";
        for (String partedesc : descripc) {
            descripcion = descripcion + " " + partedesc;
        }

        descripc = descripcion.split("<br>");
        descripcion = "";
        for (String partedesc : descripc) {
            descripcion = descripcion + " " + partedesc;
        }

        descripc = descripcion.split("<a href");
        descripcion = "";
        for (String partedesc : descripc) {
            int ind = partedesc.indexOf(">");
            descripcion = descripcion + " " + partedesc.substring(ind + 1, partedesc.length());
        }

        descripc = descripcion.split("</a>");
        descripcion = "";
        for (String partedesc : descripc) {
            descripcion = descripcion + " " + partedesc;
        }

        descripc = descripcion.split("<b>");
        descripcion = "";
        for (String partedesc : descripc) {
            descripcion = descripcion + " " + partedesc;
        }

        descripc = descripcion.split("</b>");
        descripcion = "";
        for (String partedesc : descripc) {
            descripcion = descripcion + " " + partedesc;
        }

        a.setDescripcion(descripcion);

    }

    public void getValoracion(Aplicacion a) {
        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();
        String subpag = pagina.substring(pagina.indexOf("<dl class=\"doc-metadata-list\">"), pagina.length() - 1);
        subpag = subpag.substring(subpag.indexOf("<div class=\"ratings goog-inline-block\" title=\"") + 59, subpag.length() - 1);
        String valor = subpag.substring(0, subpag.indexOf(" estrellas"));
        a.setValoracion(Double.parseDouble(valor.replace(',', '.')));
        int indice = pagina.indexOf("<span itemprop=\"ratingCount\" content=\"");
        subpag = pagina.substring(indice + 38, pagina.length() - 1);
        valor = subpag.substring(0, subpag.indexOf("\""));

        if (indice != -1) {
            a.setVotaciones(Integer.parseInt(valor));
        } else {
            a.setVotaciones(0);
        }
    }

    public void getUltimaActualizacion(Aplicacion a) {

        Calendar c = Calendar.getInstance();
        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();
        String subpag = pagina.substring(pagina.indexOf("<dl class=\"doc-metadata-list\">"), pagina.length() - 1);
        subpag = subpag.substring(subpag.indexOf("<time itemprop=\"datePublished\">") + 31, subpag.length() - 1);
        String valor = subpag.substring(0, subpag.indexOf("</time>"));

        String fecha[] = valor.split(" de ");

        int dia = Integer.parseInt(fecha[0]);
        int anio = Integer.parseInt(fecha[2]);
        int mes;

        if (fecha[1].compareTo("enero") == 0) {
            mes = 0;
        } else if (fecha[1].compareTo("febrero") == 0) {
            mes = 1;
        } else if (fecha[1].compareTo("marzo") == 0) {
            mes = 2;
        } else if (fecha[1].compareTo("abril") == 0) {
            mes = 3;
        } else if (fecha[1].compareTo("mayo") == 0) {
            mes = 4;
        } else if (fecha[1].compareTo("junio") == 0) {
            mes = 5;
        } else if (fecha[1].compareTo("julio") == 0) {
            mes = 6;
        } else if (fecha[1].compareTo("agosto") == 0) {
            mes = 7;
        } else if (fecha[1].compareTo("septiembre") == 0) {
            mes = 8;
        } else if (fecha[1].compareTo("octubre") == 0) {
            mes = 9;
        } else if (fecha[1].compareTo("noviembre") == 0) {
            mes = 10;
        } else {
            mes = 11;
        }

        c.set(anio, mes, dia);
        a.setUltimaActulizacion(c.getTime());
    }

    public void getUltimaVerion(Aplicacion a) {

        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();
        String subpag = pagina.substring(pagina.indexOf("<dl class=\"doc-metadata-list\">"), pagina.length() - 1);
        subpag = subpag.substring(subpag.indexOf("<dd itemprop=\"softwareVersion\">") + 31, subpag.length() - 1);
        String version = subpag.substring(0, subpag.indexOf("</dd>"));

        a.setVersion(version);
    }

    public void getVersionOS(Aplicacion a) {
        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();
        String subpag = pagina.substring(pagina.indexOf("<dl class=\"doc-metadata-list\">"), pagina.length() - 1);
        subpag = subpag.substring(subpag.indexOf("<dt itemprop=\"operatingSystems\" content=\"") + 41, subpag.length() - 1);
        String OS = subpag.substring(0, subpag.indexOf("\">"));

        String versionOS = subpag.substring(subpag.indexOf("<dd>") + 4, subpag.indexOf("</dd>"));

        a.setVersionOS(OS + " " + versionOS);
    }

    public void getDescargas(Aplicacion a) {
        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();
        String subpag = pagina.substring(pagina.indexOf("<dl class=\"doc-metadata-list\">"), pagina.length() - 1);
        subpag = subpag.substring(subpag.indexOf("<dd itemprop=\"numDownloads\">") + 28, subpag.length() - 1);
        String descargas = subpag.substring(0, subpag.indexOf("<"));

        a.setDescargas(descargas);
    }

    public void getSize(Aplicacion a) {
        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();
        String subpag = pagina.substring(pagina.indexOf("<dl class=\"doc-metadata-list\">"), pagina.length() - 1);
        subpag = subpag.substring(subpag.indexOf("<dd itemprop=\"fileSize\">") + 24, subpag.length() - 1);
        String size = subpag.substring(0, subpag.indexOf("</dd>"));

        a.setSize(size);
    }

    public void getPrecio(Aplicacion a) {

        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();
        String subpag = pagina.substring(pagina.indexOf("<dl class=\"doc-metadata-list\">"), pagina.length() - 1);
        subpag = subpag.substring(subpag.indexOf("<span itemprop=\"price\" content=\"") + 32, subpag.length() - 1);
        String precio = subpag.substring(0, subpag.indexOf("\""));
        Float p;
        if (precio.compareTo("0") != 0) {
            String prec[] = precio.split(",");
            String price = prec[0].concat("." + prec[1].substring(0, 2));
            p = Float.parseFloat(price);
        } else {
            p = Float.parseFloat("0");
        }

        a.setPrecio(p);
    }

    public void getClasificacion(Aplicacion a) {
        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();
        String subpag = pagina.substring(pagina.indexOf("<dl class=\"doc-metadata-list\">"), pagina.length() - 1);
        subpag = subpag.substring(subpag.indexOf("<dd itemprop=\"contentRating\">") + 29, subpag.length() - 1);
        String clasificacion = subpag.substring(0, subpag.indexOf("</dd>"));

        a.setClasificacion(clasificacion);

    }

    public void extraeAplicacion(Aplicacion a) {
        getDescripcion(a);
        getValoracion(a);
        getUltimaActualizacion(a);
        getUltimaVerion(a);
        getVersionOS(a);
        getDescargas(a);
        getSize(a);
        getPrecio(a);
        getClasificacion(a);
        getPermisos(a);
        this.analizador.analiza(a);
    }

    public void getDatosAplicacion() {

        Aplicacion a ;
        Iterator<Aplicacion> it = aplicaciones.iterator();

        while (it.hasNext()) {
            a = it.next();

            this.extraeAplicacion(a);

            System.out.println(a.getClasificacion());

        }

    }

    public boolean getAplicaciones(String url) {

        boolean masAplicaciones = false;
        String pagina = this.getPagina(url);

        int i = 0; //Indice q controla si el numero de aplicaciones de una pagina es menor que 24

        if (pagina != "") {
            masAplicaciones = true;
            String[] enlaces;
            enlaces = pagina.split("<a class=\"title\" title=\"");
            Boolean primero = true;

            for (String enlace : enlaces) {
                if (!primero) {
                    Aplicacion a = new AplicacionImpl();
                    Integer posicion = enlace.indexOf("\"");
                    String nombre = enlace.substring(0, posicion);
                    Integer comienzo = enlace.indexOf("href=\"") + 6;
                    Integer fin = enlace.indexOf("\"", comienzo);
                    String urlEnlace = enlace.substring(comienzo, fin);
                    a.setNombre(nombre);
                    a.setUrl(urlEnlace);
                    pagina = getPagina("https://play.google.com" + a.getUrl().substring(0, a.getUrl().indexOf("&amp;feature=")));
                    a.setCodigoPagina(pagina);
                    System.out.println(a);
                    aplicaciones.add(a);
                    i++;
                } else {
                    primero = false;
                }
            }

        }
        if (i < 24) {
            masAplicaciones = false;
        }
        return masAplicaciones;
    }

    public Aplicacion extraerUnaAplicacion(String url) {
        Aplicacion a = new AplicacionImpl();
        url = url.substring(url.indexOf("/store"));
        System.out.println("url");
        a.setUrl(url);
        String direccion = "https://play.google.com" + a.getUrl().substring(0, a.getUrl().indexOf("feature") - 1);
        String pagina = getPagina(direccion);

        a.setCodigoPagina(pagina);
        this.getNombre(a);
        this.extraeAplicacion(a);

        return a;
    }

    public void getNombre(Aplicacion a) {
        //String pagina=getPagina("https://play.google.com"+a.getUrl().substring(0,a.getUrl().indexOf("&amp;feature=")));
        String pagina = a.getCodigoPagina();

        String subpag = pagina.substring(pagina.indexOf("<h1 class=\"doc-banner-title\">"), pagina.length() - 1);
        subpag = subpag.substring(subpag.indexOf(">") + 1, subpag.length() - 1);
        String nombre = subpag.substring(0, subpag.indexOf("<"));

        a.setNombre(nombre);

    }

    public List<Categoria> getCategorias() {
        Integer inicio , fin;
        List<Categoria> resultado = new ArrayList<Categoria>();
        String pagina = this.getPagina("https://play.google.com/store/apps?feature=corpus_selector");

        inicio = pagina.indexOf("<li class=\"category-item");
        do {
            Categoria c = new CategoriaImpl();
            inicio = pagina.indexOf("<a", inicio);
            fin = pagina.indexOf("\">", inicio);
            String enlace = pagina.substring(inicio + 9, fin);
            c.setUrlCategoria(enlace);
            inicio = fin + 2;
            fin = pagina.indexOf("</a>", inicio);
            String nombre = pagina.substring(inicio, fin);
            c.setNombreCategoria(nombre);
            resultado.add(c);
            System.out.println(nombre);
            inicio = pagina.indexOf("<li class=\"category-item", inicio);
        } while (inicio > 0);

        return resultado;
    }

    public List<Aplicacion> getListaAplicaciones() {
        return this.aplicaciones;
    }

    public void getPermisos(Aplicacion a) {
        String pagina = a.getCodigoPagina();
        if (pagina != null) {

            String subpag = pagina.substring(pagina.indexOf("<div class=\"doc-specs-container\">"), pagina.length() - 1);
            String cadPerm[] = subpag.split("<ul class=\"doc-permissions-list\">");
            System.out.println(a.getNombre());
            List LPermisos = new ArrayList();
            for (String lpermi : cadPerm) {
                if (lpermi.length() != subpag.length()) {
                    String listaperm[] = lpermi.split("<li class=\"doc-permission-group\">");

                    for (String permi : listaperm) {
                        Permiso p = new PermisoImpl();
                        int indiceIni;
                        int indiceFin;
                        String subpermi = "";
                        indiceIni = permi.indexOf("<span class=\"doc-permission-group-title\">") + 41;
                        indiceFin = permi.indexOf("</span>");
                        String categoriaP;
                        if (indiceIni != -1 && indiceFin != -1) {
                            categoriaP = permi.substring(indiceIni, indiceFin);
                            subpermi = permi.substring(indiceFin + 7, permi.length() - 1);
                            p.setTitulo(categoriaP);
                        }

                        indiceIni = subpermi.indexOf("<div class=\"doc-permission-description\">") + 40;
                        indiceFin = subpermi.indexOf("</div>");
                        String resumen;
                        if (indiceIni != -1 && indiceFin != -1) {
                            resumen = subpermi.substring(indiceIni, indiceFin);
                            subpermi = subpermi.substring(indiceFin + 6, subpermi.length() - 1);
                            p.setResumen(resumen);
                        }

                        indiceIni = subpermi.indexOf("<div class=\"doc-permission-description-full\">") + 45;
                        indiceFin = subpermi.indexOf("</div>");

                        String descripcion = "";
                        if (indiceIni != -1 && indiceFin != -1) {
                            descripcion = subpermi.substring(indiceIni, indiceFin);
                            subpermi = subpermi.substring(indiceFin + 6, subpermi.length() - 1);
                            p.setDescripcion(descripcion);
                        }
                        System.out.println(p.toString());
                        if (p.getTitulo() != null && p.getDescripcion() != null && p.getResumen() != null) {
                            LPermisos.add(p);
                            System.out.println("Repetimos permiso: " + LPermisos.get(LPermisos.size() - 1).toString());
                        }

                    }

                } else {
                    LPermisos = null;
                }

                a.setPermisos(LPermisos);

            }

        }




    }
}
